package com.newwing.fenxiao.pay;

import java.security.KeyFactory;  
import java.security.PrivateKey;  
import java.security.PublicKey;  
import java.security.spec.PKCS8EncodedKeySpec;  
import java.security.spec.X509EncodedKeySpec;

public class RSASignature {
    
   /** 
    * 签名算法 
    */  
   public static final String SIGN_ALGORITHMS = "SHA1WithRSA";  
 
   /** 
   * RSA签名 
   * @param content 待签名数�? 
   * @param privateKey 商户私钥 
   * @param encode 字符集编�? 
   * @return 签名�? 
   */  
   public static String sign(String content, String privateKey, String encode)  
   {  
       try   
       {  
           PKCS8EncodedKeySpec priPKCS8    = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );   
             
           KeyFactory keyf                 = KeyFactory.getInstance("RSA");  
           PrivateKey priKey               = keyf.generatePrivate(priPKCS8);  
 
           java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);  
 
           signature.initSign(priKey);  
           signature.update( content.getBytes(encode));  
 
           byte[] signed = signature.sign();  
             
           return Base64.encode(signed);  
       }  
       catch (Exception e)   
       {  
           e.printStackTrace();  
       }  
         
       return null;  
   }  
     
   public static String sign(String content, String privateKey)  
   {  
       try   
       {  
           PKCS8EncodedKeySpec priPKCS8    = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );   
           KeyFactory keyf = KeyFactory.getInstance("RSA");  
           PrivateKey priKey = keyf.generatePrivate(priPKCS8);  
           java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);  
           signature.initSign(priKey);  
           signature.update(content.getBytes("utf-8"));  
           byte[] signed = signature.sign();  
           return Base64.encode(signed);  
       }  
       catch (Exception e)   
       {  
           e.printStackTrace();  
       }  
       return null;  
   }  
     
   /** 
   * RSA验签名检�? 
   * @param content 待签名数�? 
   * @param sign 签名�? 
   * @param publicKey 分配给开发商公钥 
   * @param encode 字符集编�? 
   * @return 布尔�? 
   */  
   public static boolean doCheck(String content, String sign, String publicKey,String encode)  
   {  
       try   
       {  
           KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
           byte[] encodedKey = Base64.decode(publicKey);  
           PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));  
 
         
           java.security.Signature signature = java.security.Signature  
           .getInstance(SIGN_ALGORITHMS);  
         
           signature.initVerify(pubKey);  
           signature.update( content.getBytes(encode) );  
         
           boolean bverify = signature.verify( Base64.decode(sign) );  
           return bverify;  
             
       }   
       catch (Exception e)   
       {  
           e.printStackTrace();  
       }  
         
       return false;  
   }  
     
   public static boolean doCheck(String content, String sign, String publicKey)  
   {  
       try   
       {  
           KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
           byte[] encodedKey = Base64.decode(publicKey);  
           PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));  
 
         
           java.security.Signature signature = java.security.Signature  
           .getInstance(SIGN_ALGORITHMS);  
         
           signature.initVerify(pubKey);  
           signature.update(content.getBytes("utf-8"));  
         
           boolean bverify = signature.verify(Base64.decode(sign) );  
           return bverify;  
             
       }   
       catch (Exception e)   
       {  
           e.printStackTrace();  
       }  
         
       return false;  
   }  
}
